package com.ecloud.common.utils.file;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ecloud.common.utils.check.StringUtils;

/**
 * 文件工具类
 *
 * @author LiuGangQiang Create in 2021/05/23
 */
public class FileUtils {
    private final static Logger LOGGER = LoggerFactory.getLogger(FileUtils.class);

    /**
     * 隐藏构造器
     *
     * @author LiuGangQiang Create in 2021/05/23
     */
    private FileUtils() {
    }

    /**
     * 判断文件是否存在
     *
     * @author LiuGangQiang Create in 2021/06/07
     * @param path 文件路径
     * @return {@link Boolean}
     */
    public static Boolean exist(String path) {
        if (StringUtils.isNotBlank(path) && (new File(path)).exists()) {
            return true;
        }
        return false;
    }

    /**
     * 创建文件或者文件夹
     *
     * @author LiuGangQiang Create in 2021/06/07
     * @param path 文件路径
     * @return {@link Boolean}
     * @throws IOException
     */
    public static File create(String path) {
        if (StringUtils.isNotBlank(path)) {
            File file = new File(path);
            if (!file.exists()) {
                /* 文件不存在才创建 */
                if (file.isDirectory()) {
                    /* 如果是文件夹则创建文件夹 */
                    file.mkdirs();
                } else {
                    /* 如果是文件则创建文件 */
                    try {
                        /* 判断父级文件夹是否存在 */
                        if (!file.getParentFile().exists()) {
                            file.getParentFile().mkdirs();
                        }
                        /* 创建文件 */
                        file.createNewFile();
                    } catch (IOException e) {
                        LOGGER.error("create file error : {}", e.getMessage());
                    }
                }
                return file;
            }
        }
        /* 文件存在返回false */
        return null;
    }

    /**
     * 删除目录或者文件
     *
     * @author LiuGangQiang Create in 2021/05/23
     * @param path 目录
     * @return {@link Boolean}
     */
    public static boolean delete(String path) {
        boolean flag = false;
        File file = new File(path);
        /* 判断目录或文件是否存在 */
        if (!file.exists()) {
            /* 不存在返回 false */
            return flag;
        } else {
            /* 判断是否为文件 */
            if (file.isFile()) {
                /* 为文件时调用删除文件方法 */
                return deleteFile(path);
            } else {
                /* 为目录时调用删除目录方法 */
                return deleteDirectory(path);
            }
        }
    }

    /**
     * 将字符串写入文件
     *
     * @author LiuGangQiang Create in 2021/06/07
     * @param content 文件内容
     * @param file    目标文件
     * @param append  是否是追加模式
     * @return {@link File}
     */
    public static File write(String content, File file, boolean append) {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter(file, append))) {
            bw.write(content);
        } catch (IOException e) {
            LOGGER.error("write content to {} error : {}", file.getPath(), e.getMessage());
        }
        return file;
    }

    /**
     * 删除单个文件
     *
     * @author LiuGangQiang Create in 2021/05/23
     * @param path 文件
     * @return {@link Boolean}
     */
    private static boolean deleteFile(String path) {
        boolean flag = false;
        File file = new File(path);
        /* 路径为文件且不为空则进行删除 */
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

    /**
     * 删除目录
     *
     * @author LiuGangQiang Create in 2021/05/23
     * @param path 目录
     * @return {@link Boolean}
     */
    private static boolean deleteDirectory(String path) {
        /* 如果path不以文件分隔符结尾，自动添加文件分隔符 */
        if (!path.endsWith(File.separator)) {
            path = path + File.separator;
        }
        File dirFile = new File(path);
        /* 如果dir对应的文件不存在，或者不是一个目录，则退出 */
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        boolean flag = true;
        /* 删除文件夹下的所有文件(包括子目录) */
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            /* 删除子文件 */
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            } else {
                /* 删除子目录 */
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag)
            return false;
        /* 删除当前目录 */
        if (dirFile.delete()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 读取输入流为字符串
     *
     * @author LiuGangQiang Create in 2021/06/09
     * @param in 输入流
     * @return {@link String}
     */
    public static String read(InputStream in) {
        StringBuilder sb = new StringBuilder();
        String line;
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        try {
            while ((line = br.readLine()) != null) {
                sb.append(line).append(System.getProperty("line.separator"));
            }
        } catch (IOException e) {
            LOGGER.error("read inputstream to string error : {}", e.getMessage());
        }
        return sb.toString();
    }
}